
#include <malloc.h>
#include <string.h>

#include "recepcion-asignacion.h"
#include "../varios/log.h"
#include "../varios/mensajes.h"
#include "../varios/mpi-utiles.h"



/*
 * Implementacion de funcion definida en cabecera
 */
struct ASIGNACION_NODO *obtenerAsignacionTrabajo() {
    
    LOGGER("Esperamos a que llegue el asignacion");
    struct DATOS_RECIBIDOS cronPlano = recibirDatos(0, MSG_ASIGNACION);
    
    LOGGER("Asignacion recibido como array de bytes. Procedemos a convertirlo en asignacion");
    
    struct ASIGNACION_NODO *asignacion = malloc(sizeof(struct ASIGNACION_NODO));
    
    // Variable que nos permite recorrer el array de bytes secuencialmente
    char *ptrBloque = cronPlano.datos;
    
    // Copiamos la propiedad cantidadOrigenesIntermedios
    int tam1 = sizeof(int);
    memcpy(&asignacion->cantOriginesIntermedios, ptrBloque, tam1);
    ptrBloque += tam1;
    
    int cantInterm = asignacion->cantOriginesIntermedios; // Guardamos por practicidad
    
    // Copiamos la propiedad origenesIntermedios
    int tam2 = sizeof(int) * cantInterm;
    asignacion->originesIntermedios = malloc(tam2);
    memcpy(asignacion->originesIntermedios, ptrBloque, tam2);
    ptrBloque += tam2;
    
    // Copiamos la propiedad tamVectoresIntermedios
    int tam3 = sizeof(long long) * cantInterm;
    asignacion->tamVectoresIntermedios = malloc(tam3);
    memcpy(asignacion->tamVectoresIntermedios, ptrBloque, tam3);
    ptrBloque += tam3;
    
    // Copiamos la propiedad tamVectorInicial
    int tam4 = sizeof(long long);
    memcpy(&asignacion->tamVectorInicial, ptrBloque, tam4);
    ptrBloque += tam4;
    
    // Copiamos la propiedad destinoFinal
    int tam5 = sizeof(int);
    memcpy(&asignacion->destinoFinal, ptrBloque, tam5);
    ptrBloque += tam5;
    
    LOGGER("Conversión finalizada");
    return asignacion;
    
}


/*
 * Implementacion de funcion definida en cabecera
 */
char *imprimirAsignacion(struct ASIGNACION_NODO *cron) {
    
    char *vect1 = imprimirBloqueInt(cron->originesIntermedios, cron->cantOriginesIntermedios);
    char *vect2 = imprimirBloqueLong(cron->tamVectoresIntermedios, cron->cantOriginesIntermedios);

    int tam1 = strlen(vect1);
    int tam2 = strlen(vect2);
    
    char* impr = malloc(sizeof(char) * (tam1+tam2+1000));
    impr[0] = 0;
    sprintf(impr, "ASIGNACION_NODO = {\n\tcantOriginesIntermedios=%d,\n\toriginesIntermedios=%s,\n\ttamVectoresIntermedios=%s,\n\ttamVectorInicial=%lld,\n\tdestinoFinal=%d\n}",
        cron->cantOriginesIntermedios, vect1, vect2, cron->tamVectorInicial, cron->destinoFinal);
    
    free(vect1);
    free(vect2);
    
    return impr;
    
}